/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Envios.Controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import pe.edu.pucp.Envios.DAO.EnviosDAO;
import pe.edu.pucp.Envios.Vista.AdministrarEntregasGUI;
import pe.edu.pucp.Envios.Vista.AdministrarEnviosGUI;
import pe.edu.pucp.Envios.Vista.AlertarEnvioGUI;
import pe.edu.pucp.Modelo.EstadoEnvio;
import pe.edu.pucp.Modelo.Itinerario;
//import pe.edu.pucp.Modelo.Permiso;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Modelo.Vuelo;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.LogHelper;
import pe.edu.pucp.Util.ValHelper;

/**
 *
 * @author pachon
 */
public class AdministrarEnviosControlador {
    private EnviosDAO m;
    private AdministrarEnviosGUI view;
    private Usuario user;
    private ArrayList<Vuelo> lstVuelos;
    private ArrayList<Itinerario> lstVuelosBusquedaEntrada;
    private ArrayList<Itinerario> lstVuelosBusquedaSalida;
    private ArrayList<EstadoEnvio> lstEstados;
    

    public AdministrarEnviosControlador(EnviosDAO dao, AdministrarEnviosGUI view, Usuario usr){
        this.m = dao;
        this.view = view;        
        this.user = usr;                
        //view.mostrarPermisos(new  ArrayList<Permiso>(user.getPerfil().getPermisos())); 
        
        llenaVuelos();
        llenaEstados();    
        view.limpiar();
        lstVuelosBusquedaEntrada = m.listarVuelosBusquedaEntrada(null, null, null, user);
        lstVuelosBusquedaSalida = m.listarVuelosBusquedaSalida(null, null, null, user);
        view.llenaGrillaEntrante(lstVuelosBusquedaEntrada);
        view.llenaGrillaSaliente(lstVuelosBusquedaSalida);
        //agregar listeners
        view.addBuscarButtonListener(new BuscarButtonListener());
        view.addEntregarButtonListener(new EntregarButtonListener());
        view.addEntradaButtonListener(new EntradaButtonListener());
        view.addSalidaButtonListener(new SalidaButtonListener());        
        view.addLimpiarButtonListener(new LimpiarButtonListener());
    }
    
    private void llenaVuelos(){
        lstVuelos = m.listarVuelos(user);
        view.llenaVuelos(lstVuelos);
    }
    private void llenaEstados(){
        lstEstados = m.listarEstadosEnvio();
        view.llenaEstados(lstEstados);
    }
    
    class LimpiarButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            view.limpiar();
            lstVuelosBusquedaEntrada = m.listarVuelosBusquedaEntrada(null, null, null, user);
            lstVuelosBusquedaSalida = m.listarVuelosBusquedaSalida(null, null, null, user);
            view.llenaGrillaEntrante(lstVuelosBusquedaEntrada);
            view.llenaGrillaSaliente(lstVuelosBusquedaSalida);
        }
    }
    class BuscarButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            
            lstVuelosBusquedaEntrada = m.listarVuelosBusquedaEntrada(lstVuelos.get(view.getVuelo()) , lstEstados.get(view.getEstado()), view.getCliente(), user);
            lstVuelosBusquedaSalida = m.listarVuelosBusquedaSalida(lstVuelos.get(view.getVuelo()) , lstEstados.get(view.getEstado()), view.getCliente(), user);
            view.llenaGrillaEntrante(lstVuelosBusquedaEntrada);
            view.llenaGrillaSaliente(lstVuelosBusquedaSalida);
        }
    }
    
    ///Cambios aca, verificar
    class EntregarButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //int 
            int i = view.getSelectedVueloEntrante();
            
            if (i>= 0){
                Itinerario itinerario = lstVuelosBusquedaEntrada.get(i);            
                if(itinerario.getTipoEscala().getIdtipo()== Constante.TIPO_ESCALA_FIN){
                EnviosDAO dao = new EnviosDAO();
                if(dao.lugarfinal(itinerario)){
                AdministrarEntregasGUI v = new AdministrarEntregasGUI(view.getPadre(), true, itinerario);
                AdministrarEntregasControlador c = new AdministrarEntregasControlador(dao, v, user);
                v.setVisible(true);            
                }
                else {
                    JOptionPane.showMessageDialog(view.getPadre(), "El envio no se encuentra en su destino final", "Aviso", JOptionPane.INFORMATION_MESSAGE); 
                }
                } else {
                    //Mostrar mensaje indicando que es el nodo final.
                    JOptionPane.showMessageDialog(view.getPadre(), "El envio se encuentra en su destino final. Generar la entrega", "Alerta", JOptionPane.INFORMATION_MESSAGE);                }                
            }
            else{
                ValHelper.mostrarAviso("Seleccione un itineraio.");
            }
        }
    }
    class EntradaButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
       
            int i = view.getSelectedVueloEntrante();
            if (i>= 0){
                //Son los nodos que voy a "llegan"
                EnviosDAO dao = new EnviosDAO();
                Itinerario itinerario = lstVuelosBusquedaEntrada.get(i);   
                AlertarEnvioGUI v = new AlertarEnvioGUI(view.getPadre(), true);
                AlertarEnvioControlador c = new AlertarEnvioControlador(dao, v, user, itinerario);
                v.setVisible(true);
            }
        }
    }
    class SalidaButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            int i = view.getSelectedVueloSaliente();
            if (i>= 0){                
                Itinerario itinerario = lstVuelosBusquedaSalida.get(i);
                try {
                    m.RegistrarNotaSalida(itinerario, user);
                    LogHelper.registrarOperacion(user, Constante.ACCION_REGISTRAR, Constante.OBJETO_NOTA_SALIDA, "Se registró la nota de salida de envios desde el "+user.getAeropuerto().getDescripcion());
                    JOptionPane.showMessageDialog(view.getPadre(), "Se registró eitosamente la nota de salida", "Confirmación", JOptionPane.INFORMATION_MESSAGE); 
                    lstVuelosBusquedaEntrada = m.listarVuelosBusquedaEntrada(null, null, null, user);
                    lstVuelosBusquedaSalida = m.listarVuelosBusquedaSalida(null, null, null, user);
                    view.llenaGrillaEntrante(lstVuelosBusquedaEntrada);
                    view.llenaGrillaSaliente(lstVuelosBusquedaSalida);
                } catch(Exception ec) {
                    JOptionPane.showMessageDialog(view.getPadre(), "No se pudo registrar la nota de salida. Error: " + ec.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); 
                }
            }
        }
    }
    
}
